package cn.chenbonian;

import java.sql.*;

/**
 * @author chbn
 * @create 2021-10-26
 */

public class JdbcTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1. 注册驱动（加载驱动）
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接对象（建立连接）
        /**
         1、数据库URL
         url用于标识数据库的位置，程序员通过url地址告诉JDBC程序连接哪个数据库，URL的写法为：jdbc:mysql:［］//localhost:3306/shen ?参数名：参数值
         常用数据库URL地址的写法：
         Oracle：jdbc:oracle:thin:@localhost:1521:shen
         SqlServer：jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=shen
         MySql：jdbc:mysql://localhost:3306/shen
         
         注意：如果是localhost:3306，mysql可以简写为：jdbc:mysql:///sid（尽量不这样）
         
         2、Connection
         Jdbc程序中的Connection，它用于代表数据库的链接，Collection是数据库编程中最重要的一个对象，客户端与数据库所有交互都是通过connection对象完成的，创建方法为：
         Connection conn = DriverManager.getConnection(url,username,password);
         这个对象的常用方法：
         方法                                描述
         createStatement()                  创建向数据库发送sql的statement对象。
         prepareStatement(sql)	            创建向数据库发送预编译sql的PrepareSatement对象。
         prepareCall(sql)	                创建执行存储过程的callableStatement对象。
         setAutoCommit(boolean autoCommit)	设置事务是否自动提交。
         commit()	                        在链接上提交事务。
         rollback()	                        在此链接上回滚事务。
         */
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/tedu_study", "root", "123456");
        //3. 创建SQL执行对象
        Statement statement = connection.createStatement();
        /**
         Statement和PreparedStatement：
         1）PreparedStatement预编译的SQL执行对象；
         2）可以避免SQL注入，因为在编译的时候已经把SQL的逻辑固定，不会因为替换进去的内容改变逻辑；
         3）如果SQL中涉及变量，相比Statement的字符串拼接的方式，代码可读性提高，并且不容易出错；
         4）如果涉及批量执行多条SQL时，使用PreparedStatement执行效率较高；
         5）如果SQL中没有变量用Statement，有变量用PreparedStatement；
         
         6）Statement会使数据库频繁编译SQL，可能造成数据库缓冲区溢出。PreparedStatement 可对SQL进行预编译，从而提高数据库的执行效率。
         7）并且PreperedStatement对于sql中的参数，允许使用占位符的形式进行替换，简化sql语句的编写。
         */
        PreparedStatement st = connection.prepareStatement("");
        //4. 执行SQL
        // String sql = "create table if not exists jdbct1(id int,name varchar(10))";
        String sql = "drop table if exists jdbct1";
        /**
         执行SQL对象的方法：
         execute(sql)       此方法返回值代表是否有结果集，此方法可以执行任意SQL但是推荐执行DDL（数据定义语言 create alter drop truncate）
         executeUpdate(sql) 可以执行增删改操作， 此方法返回值为int类型表示生效的行数
         executeQuery(sql)  执行查询SQL语句 返回值为结果集
         
         */
        statement.execute(sql);
        //5. 关闭资源
        System.out.println("执行成功！");
        statement.close();
        connection.close();
        
    }
}
